home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Arashi 1.1.1 / source code / For your think c folder / VA Kit ƒ / VAHeart.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-09  |  8.8 KB  |  366 lines  |  [TEXT/KAHL]

  1. /*/
  2.      Project Arashi: VAHeart.c
  3.      Major release: Version 1.1d2, 9/5/95
  4.  
  5.      Last modification: Wednesday, September 9, 1992, 21:41
  6.      Created: Friday, February 3, 1989, 21:18
  7.  
  8.      Copyright © 1989-1992, Juri Munkki
  9. /*/
  10.  
  11. #include "VAInternal.h"
  12. #include "VA.h"
  13.  
  14. void    VAEraseBuffer()
  15. {
  16.     int        mode=QD32COMPATIBLE;
  17.     SwapMMUMode(&mode);
  18.  
  19.     if(VA.frame.right & 15)
  20. asm    {
  21.     move.l    VA.base,A0
  22.     move.w    VA.frame.bottom,D0
  23.     subq.w    #1,D0
  24.     moveq.l    #-1,D2
  25. @vertigo
  26.     move.w    VA.frame.right,D1
  27.     subq.w    #1,D1
  28.     move.l    A0,A1
  29.     add.w    VA.row,A0
  30. @horigo
  31.     move.b    D2,(A1)+
  32.     dbra    D1,@horigo
  33.     dbra    D0,@vertigo
  34.     }
  35.     else
  36. asm    {
  37.     move.l    VA.base,A0
  38.     move.w    VA.frame.bottom,D0
  39.     subq.w    #1,D0
  40.     moveq.l    #-1,D2
  41. @bvertigo
  42.     move.w    VA.frame.right,D1
  43.     asr.w    #4,D1
  44.     subq.w    #1,D1
  45.     move.l    A0,A1
  46.     add.w    VA.row,A0
  47. @bhorigo
  48.     move.l    D2,(A1)+
  49.     move.l    D2,(A1)+
  50.     move.l    D2,(A1)+
  51.     move.l    D2,(A1)+
  52.     dbra    D1,@bhorigo
  53.     dbra    D0,@bvertigo
  54.     }
  55.     SwapMMUMode(&mode);
  56.  
  57.     VA.ticker=QuickTicks+VA.FrameSpeed;    
  58.  
  59. #ifdef    COPYRIGHT_MESSAGE
  60.     {    char    *copyr="\PSTORM Test Bench 0.9,Copyright 1991 Project STORM Team";
  61.  
  62. #ifdef    REALTEXT
  63.         SetPort(VA.window);
  64.         MoveTo(20,VA.frame.bottom-12);
  65.         TextSize(9);
  66.         TextMode(srcCopy);
  67.         RGBForeColor(VAColorToQD(BG2));
  68.         RGBBackColor(VAColorToQD(BGC));
  69.         PmForeColor(BG2);
  70.         DrawString(copyr);
  71. #else
  72.         VA.color=BG2;
  73.         VAMoveTo(20,VA.frame.bottom-10);
  74.         VA.segmscale=2;
  75.         VADrawText(copyr+1,0,*copyr);
  76. #endif
  77.     }    
  78. #endif
  79. }
  80.  
  81. void    VABresenham(x1,y1,x2,y2)
  82. int        x1,y1,x2,y2;
  83. {
  84. asm    {
  85.     movem.l    D3-D7,-(sp)
  86.     
  87.     move.l    VA.base,A0
  88.     
  89.     move.w    x1,D0        ;    X1 to D0
  90.     move.w    x2,D1        ;    X2 to D1
  91.     move.w    y1,D2        ;    Y1 to D2
  92.     move.w    y2,D3        ;    Y2 to D3
  93.  
  94.     cmp.w    D1,D0        ;    Is X1<X2
  95.     blt.s    @right        ;    Yes
  96.     exg.l    D0,D1        ;    Swap X1 and X2
  97.     exg.l    D2,D3        ;    Swap Y1 and Y2
  98. @right
  99.  
  100.     move.w    D1,D6
  101.     sub.w    D0,D6        ;    DeltaX to D6
  102.  
  103.     move.w    D3,D7
  104.     sub.w    D2,D7        ;    DeltaY to D7
  105.     bpl.s    @delta2
  106.     neg.w    D7            ;    Abs DeltaY
  107. @delta2
  108.     move.w    VA.row,D4    ;    VA.row into D4
  109.     move.l    VA.quickrow,A1        ;    Pointer to base address table
  110.     move.l    (0,A1,D2.w*4),A0    ;    Get pointer to row base
  111.     add.w    D0,A0        ;    Add X1 to base address
  112.  
  113.     move.l    (0,A1,D3.w*4),A1
  114.     add.w    D1,A1
  115.  
  116.     cmp.w    D3,D2        ;    is Y1<Y2
  117.     blt.s    @down        ;    Yes, direction is down
  118.     neg.w    D4            ;    No, direction is up
  119. @down
  120.     ext.l    D4            ;    Sign extend D4
  121.     move.l    VA.offset,D0;    D0 is offset from byte boundary.
  122.     
  123.     move.w    VA.color,D1    ;    Copy colorvalue to D1
  124.     move.w    VA.field,D5    ;    Field width to D5
  125.     cmp.w    D6,D7        ;    is DeltaY>=DeltaX?
  126.     bge        @vertigo    ;    Yes, jump
  127.  
  128.     move.w    D6,D2        ;    ErrorAcc=DeltaX
  129.     asr.w    #1,D2        ;    ErrorAcc=DeltaX/2
  130.     move.w    D2,D3        ;    DeltaX/2 is loop counter
  131. @xplot
  132.     subq.w    #8,D3        ;    Subtract 8 from loopcount
  133.     bmi        @xshort        ;    Should we fall out?
  134.  
  135.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  136.     addq.l    #1,A0        ;    Advance to next x pixel
  137.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  138.     subq.l    #1,A1
  139.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  140.     bpl.s    @xnext1        ;    No acc overflow
  141.     add.l    D4,A0        ;    Move RowBase to next line
  142.     sub.l    D4,A1
  143.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  144. @xnext1
  145.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  146.     addq.l    #1,A0        ;    Advance to next x pixel
  147.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  148.     subq.l    #1,A1
  149.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  150.     bpl.s    @xnext2        ;    No acc overflow
  151.     add.l    D4,A0        ;    Move RowBase to next line
  152.     sub.l    D4,A1
  153.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  154. @xnext2
  155.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  156.     addq.l    #1,A0        ;    Advance to next x pixel
  157.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  158.     subq.l    #1,A1
  159.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  160.     bpl.s    @xnext3        ;    No acc overflow
  161.     add.l    D4,A0        ;    Move RowBase to next line
  162.     sub.l    D4,A1
  163.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  164. @xnext3
  165.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  166.     addq.l    #1,A0        ;    Advance to next x pixel
  167.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  168.     subq.l    #1,A1
  169.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  170.     bpl.s    @xnext4        ;    No acc overflow
  171.     add.l    D4,A0        ;    Move RowBase to next line
  172.     sub.l    D4,A1
  173.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  174. @xnext4
  175.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  176.     addq.l    #1,A0        ;    Advance to next x pixel
  177.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  178.     subq.l    #1,A1
  179.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  180.     bpl.s    @xnext5        ;    No acc overflow
  181.     add.l    D4,A0        ;    Move RowBase to next line
  182.     sub.l    D4,A1
  183.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  184. @xnext5
  185.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  186.     addq.l    #1,A0        ;    Advance to next x pixel
  187.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  188.     subq.l    #1,A1
  189.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  190.     bpl.s    @xnext6        ;    No acc overflow
  191.     add.l    D4,A0        ;    Move RowBase to next line
  192.     sub.l    D4,A1
  193.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  194. @xnext6
  195.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  196.     addq.l    #1,A0        ;    Advance to next x pixel
  197.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  198.     subq.l    #1,A1
  199.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  200.     bpl.s    @xnext7        ;    No acc overflow
  201.     add.l    D4,A0        ;    Move RowBase to next line
  202.     sub.l    D4,A1
  203.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  204. @xnext7
  205.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  206.     addq.l    #1,A0        ;    Advance to next x pixel
  207.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  208.     subq.l    #1,A1
  209.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  210.     bpl        @xplot        ;    No acc overflow
  211.     add.l    D4,A0        ;    Move RowBase to next line
  212.     sub.l    D4,A1
  213.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  214. @xnext8
  215.     bra        @xplot
  216. @xshort
  217.     addq.w    #8,D3
  218. @xplot2
  219.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  220.     addq.l    #1,A0        ;    Advance to next x pixel
  221.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  222.     subq.l    #1,A1
  223.     sub.w    D7,D2        ;    ErrorAcc-=DeltaY
  224.     bpl.s    @xnext        ;    No acc overflow
  225.     add.l    D4,A0        ;    Move RowBase to next line
  226.     sub.l    D4,A1
  227.     add.w    D6,D2        ;    Acc overflow. ErrorAcc+=DeltaX
  228. @xnext
  229.     dbra    D3,@xplot2    ;    Loop...
  230.     bra        @exit
  231.     
  232. @vertigo
  233.     move.w    D7,D2        ;    ErrorAcc=DeltaY
  234.     asr.w    #1,D2        ;    ErrorAcc=DeltaY/2
  235.     move.w    D2,D3        ;    DeltaY/2 is loop counter
  236. @yplot
  237.     subq.w    #8,D3
  238.     bmi        @yshort
  239.  
  240.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  241.     add.l    D4,A0        ;    Move RowBase to next line
  242.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  243.     sub.l    D4,A1        ;    Move RowBase to next line
  244.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  245.     bpl.s    @ynext1        ;    No acc overflow
  246.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  247.     addq.l    #1,A0        ;    Advance to next x pixel
  248.     subq.l    #1,A1
  249. @ynext1
  250.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  251.     add.l    D4,A0        ;    Move RowBase to next line
  252.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  253.     sub.l    D4,A1        ;    Move RowBase to next line
  254.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  255.     bpl.s    @ynext2        ;    No acc overflow
  256.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  257.     addq.l    #1,A0        ;    Advance to next x pixel
  258.     subq.l    #1,A1
  259. @ynext2
  260.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  261.     add.l    D4,A0        ;    Move RowBase to next line
  262.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  263.     sub.l    D4,A1        ;    Move RowBase to next line
  264.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  265.     bpl.s    @ynext3        ;    No acc overflow
  266.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  267.     addq.l    #1,A0        ;    Advance to next x pixel
  268.     subq.l    #1,A1
  269. @ynext3
  270.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  271.     add.l    D4,A0        ;    Move RowBase to next line
  272.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  273.     sub.l    D4,A1        ;    Move RowBase to next line
  274.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  275.     bpl.s    @ynext4        ;    No acc overflow
  276.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  277.     addq.l    #1,A0        ;    Advance to next x pixel
  278.     subq.l    #1,A1
  279. @ynext4
  280.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  281.     add.l    D4,A0        ;    Move RowBase to next line
  282.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  283.     sub.l    D4,A1        ;    Move RowBase to next line
  284.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  285.     bpl.s    @ynext5        ;    No acc overflow
  286.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  287.     addq.l    #1,A0        ;    Advance to next x pixel
  288.     subq.l    #1,A1
  289. @ynext5
  290.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  291.     add.l    D4,A0        ;    Move RowBase to next line
  292.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  293.     sub.l    D4,A1        ;    Move RowBase to next line
  294.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  295.     bpl.s    @ynext6        ;    No acc overflow
  296.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  297.     addq.l    #1,A0        ;    Advance to next x pixel
  298.     subq.l    #1,A1
  299. @ynext6
  300.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  301.     add.l    D4,A0        ;    Move RowBase to next line
  302.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  303.     sub.l    D4,A1        ;    Move RowBase to next line
  304.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  305.     bpl.s    @ynext7        ;    No acc overflow
  306.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  307.     addq.l    #1,A0        ;    Advance to next x pixel
  308.     subq.l    #1,A1
  309. @ynext7
  310.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  311.     add.l    D4,A0        ;    Move RowBase to next line
  312.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  313.     sub.l    D4,A1        ;    Move RowBase to next line
  314.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  315.     bpl        @yplot        ;    No acc overflow
  316.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  317.     addq.l    #1,A0        ;    Advance to next x pixel
  318.     subq.l    #1,A1
  319.  
  320.     bra        @yplot
  321. @dot
  322.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  323.     bra.s    @exit
  324. @yshort
  325.     addq.l    #8,D3
  326. @yplot2
  327.     bfins    D1,(A0){D0:D5}    ;    Draw pixel
  328.     add.l    D4,A0        ;    Move RowBase to next line
  329.     bfins    D1,(A1){D0:D5}    ;    Draw pixel
  330.     sub.l    D4,A1        ;    Move RowBase to next line
  331.     sub.w    D6,D2        ;    ErrorAcc-=DeltaX
  332.     bpl.s    @ynext        ;    No acc overflow
  333.     add.w    D7,D2        ;    Acc overflow. ErrorAcc+=DeltaY
  334.     addq.l    #1,A0        ;    Advance to next x pixel
  335.     subq.l    #1,A1
  336. @ynext
  337.     dbra    D3,@yplot2    ;    Loop...
  338.  
  339. @exit
  340.     movem.l    (sp)+,D3-D7
  341.     }
  342. }
  343.  
  344. void    VAStaticLine(x1,y1,x2,y2)
  345. int        x1,y1,x2,y2;
  346. {
  347.     int        mode;
  348.     
  349.     mode=QD32COMPATIBLE;
  350.     SwapMMUMode(&mode);
  351.     VABresenham(x1,y1,x2,y2);
  352.     SwapMMUMode(&mode);
  353. }
  354.  
  355. void    VAStaticLineTo(x,y)
  356. int        x,y;
  357. {
  358.     int        mode;
  359.     
  360.     mode=QD32COMPATIBLE;
  361.     SwapMMUMode(&mode);
  362.     VABresenham(VA.CurrentX,VA.CurrentY,x,y);
  363.     VAMoveTo(x,y);
  364.     SwapMMUMode(&mode);
  365. }
  366.